from microbit import *
from random import randrange
from time import sleep

def getRand(n):
    return randrange(n)

def getNewPoint(): # 随机生成一个坐标
    return (getRand(5), getRand(5))

def getNewApple(): # 生成一个苹果，返回坐标
    while True:
        a = getNewPoint()
        if img.get_pixel(*a) == 0: # 如果这一格上没有身体或苹果
            return a # 就放在这一格上

def newDire(): # 判断转向
    global velo
    if button_a.was_pressed() or button_a.is_pressed(): # 判断左转
        velo = (velo + 1) % 4
    if button_b.was_pressed() or button_b.is_pressed(): # 判断右转
        velo = (velo + 3) % 4

def move(pos, velo): # 从 pos 位置向 velo 方向移动一格
    return ((pos[0] + dire[velo][0] + 5) % 5,
            (pos[1] + dire[velo][1] + 5) % 5)

def equal(pos1, pos2): # 判断两个坐标是否相等
    return pos1[0] == pos2[0] and pos1[1] == pos2[1]

def mainLoop(): # 主循环
    global pos, img, snk, appleExist, app, velo
    if not appleExist: # 如果当前没有苹果
        app = getNewApple() # 生成一个苹果
        appleExist = True
        img.set_pixel(app[0], app[1], 9) # 绘制苹果
    newDire() # 检测方向变化
    newPos = move(snk[-1], velo) # 向这个方向移动一格

    if not equal(app, newPos): # 如果没有吃到苹果
        pos = snk.pop(0) # 就把尾巴缩回去
        img.set_pixel(pos[0], pos[1], 0) # 把尾巴的像素点擦掉
    else:
        app = None
        appleExist = False # 现在场上没有苹果了
    if img.get_pixel(newPos[0], newPos[1]) == 5: # 如果撞到自己了
        return False # 蛇死
    img.set_pixel(newPos[0], newPos[1], 5) # 画移动后的头
    snk.append(newPos) # 蛇身列表把头加进去
    return True # 还活着

while True:

    snk = [getNewPoint()] # 随机生成一个点作为头
    dire = [(0, 1), (1, 0), (0, -1), (-1, 0)] # 下右上左四个坐标分量

    velo = getRand(4) # 随机一个方向

    img = Image("00000:00000:00000:00000:00000") # 当前地图上什么都没有
    img.set_pixel(snk[0][0], snk[0][1], 5) # 画头

    appleExist = False # 现在场上没有苹果
    app = None

    while True:
        res = mainLoop() # 主循环
        display.show(img) # 显示图像
        sleep(0.5) # 延迟
        if not res: # 如果蛇没了就跳出循环
            break
    display.scroll("Game Over") # 显示提示文字

    a.was_pressed()
    while not button_a.was_pressed(): # 按左键重新开始
        pass
